package com.cskaoyan.javase.oop1._12import._1onepackage;

import  com.cskaoyan.javase.oop1._12import._2anotherpackage.*;
/**
 * @description: import关键字的使用
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 在Demo类中完成以下测试:
 * 1.在Demo类中直接创建Student对象，然后调用test方法，请问输出的结果是什么？
 * 结果是onepackage包下的Student类的输出结果
 *
 * 2.如果想要test方法调用得出anotherpackage包中Student类的结果，需要怎么做？
 *      有两种解决方法:
 *          1.创建对象时不使用简单的类名,而使用全限定类名
 *              这种方法是可以实现功能的,但是它太长了,不方便,不是万不得已,不要使用这种方式
 *          2.使用import关键字进行导包操作,就可以省略全限定类名,而使用简单类名
 *              import关键字表示导入类的语法: import + 全限定类名
 *              import关键字导包的位置: 放在package声明和有效代码的中间,一般直接跟在package声明后面即可
 *
 * 通过以上案例,总结一下java编译器在查找检索一个类去使用时,它的检索机制:
 *      1.同包情况下: 在同包下类名是完全不可能相同的,所以查找一个类要么就有,要么就没有
 *          能够找到这个类时,代码正常执行,如果找不到就会编译报错
 *
 *      2.不同包下: 如果想要使用不同包下的类,因为不同包下完全可能出现同名类,
 *          这时如果仅仅写简单类名,编译器是无法找到一个类的,就需要程序员明确指出该类的所在包
 *          有以下两种方式:
 *              1.使用的时候直接用全限定类名
 *              2.使用import导包(更常用)
 *
 * 注意事项：
 * 1. import导包语句应该放在**package声明之后，有效代码之前~**
 *    - 正常情况下，我们使用某个类idea会自动导包，不用太关心这条语句的位置
 *
 * 2. 像String、System、Math等常用类很明显不是同包下的类，但我们并没有进行导包操作
 *    - 这是因为在Java当中，java.lang包是Java的核心类包，具有隐式的导包
 *    - **注意java.lang包下的所有类是隐式的导入了每个Java类，而不是没有导入！**
 *
 * 3.假如有同时使用同包和不同包下的两个同名类的需求,这个时候可以考虑一个使用全限定类名,另一个导包/同包使用
 *      当然尽量还是不要出现这种情况,如果出现了先考虑改名字
 *      如果改不了,再使用全限定类名
 *
 * 额外的几个问题:
 * 1.编译单元的概念: 在java当中每一个java文件都是一个编译单元,
 *  其中的所有class,包括public修饰的,还有非public的,都属于同一个编译单元(也是同一个包)
 * 注意: **如果编译单元中已存在同名类，那么这时就不能通过导包去使用其它包下的同名类了~**
 *
 * 2.import在导入class时,存在智能导包,语法:
 *      import + 包名 +  *;
 * 其中"*"表示通配,该条语句表示会智能得根据情况,决定导入某个类
 * 理解智能导入,重点在于理解何为"智能"
 * 实际上智能导入和类加载的"懒加载"很相似,智能导入只有在不导入一个class会报错时才会导入一个类
 *
 */

//测试类
public class Demo {
    public static void main(String[] args) {
        /*Student s = new Student();
        s.test();

        //用全限定类名创建对象
        com.cskaoyan.javase.oop1._12import._2anotherpackage.Student stu = new com.cskaoyan.javase.oop1._12import._2anotherpackage.Student();
        stu.test();*/
        /*
        同一个编译单元下不能导入同名类
        Teacher t = new Teacher();
        t.test();

        com.cskaoyan.javase.oop1._12import._2anotherpackage.Teacher t2 = new com.cskaoyan.javase.oop1._12import._2anotherpackage.Teacher();
        t2.test();*/

        //测试智能导入
        Student s = new Student();
        s.test();

        Teacher t = new Teacher();
        t.test();
    }
}

//'Teacher' is already defined in this compilation unit
//class Teacher {
//    public void test() {
//        System.out.println("onepackage包下的非pubic class Teacher");
//    }
//}